/**
 * 单例模式顾名思义，保证一个类仅可以有一个实例化对象，并且提供一个可以访问它的全局接口。实现单例模式必须注意一下几点：
 * 1.单例类只能有一个实例化对象。
 * 2.单例类必须自己提供一个实例化对象。
 * 3.单例类必须提供一个可以访问唯一实例化对象的接口。
 * 缺点：
 * 1.单例模式可能掩盖不良设计，比如程序各组件之间相互了解过多等。
 * 2.单例的客户端代码单元测试可能会比较困难， 因为许多测试框架以基于继承的方式创建模拟对象。
 */
#pragma once

#include <string>
#include <memory>

namespace singleton
{
class Singleton
{
public:
    static Singleton& instance();

    std::string value();
    void setValue(const std::string& value);
private:
    Singleton() {}                                    //构造函数私有
    Singleton(const Singleton&) = delete;            //明确拒绝
    Singleton& operator=(const Singleton&) = delete; //明确拒绝

    std::string m_value;
};

Singleton& Singleton::instance()
{
    static Singleton s;
    return s;
}

std::string Singleton::value()
{
    return m_value;
}

void Singleton::setValue(const std::string& value)
{
    m_value = value;
}

void ClientCode()
{
    Singleton::instance().setValue("123");
    std::cout << &Singleton::instance()<< endl;
    Singleton::instance().setValue("456");
    std::cout << &Singleton::instance()<< endl;
}
}
